let log4js = require('log4js');
let bytes = require('bytes');
let config = require('../config/logConfig');


//加载配置文件
log4js.configure(config);


let errorLogger = log4js.getLogger('err');
let resLogger = log4js.getLogger('res');

/**
 * 封装错误日志
 * @param ctx
 * @param error
 * @param ms
 */
let logError = function (ctx, error, ms) {
	if (ctx && error) {
		errorLogger.error(formatError(ctx, error, ms));
	}
};

/**
 * 封装响应日志
 * @param ctx
 * @param ms
 */
let logResponse = function (ctx, ms) {
	if (ctx) {
		resLogger.info(formatRes(ctx, ms));
	}
};

/**
 * 格式化响应日志
 * @param ctx
 * @param ms
 * @returns {string}
 */
let formatRes = function (ctx, ms) {
	//响应日志开始
	let logText = `\n---------- response log start ----------\n`;

	//添加请求日志
	logText += formatReqLog(ctx, ms);
	//响应状态码
	logText += `response status: ${ctx.status}\n`;
	//响应长度
	logText += `response length: ${bytes(ctx.length)}\n`;

	//响应内容
	logText += `response body: ${JSON.stringify(ctx.body)} \n`;
	//响应日志结束
	logText += `---------- response log  end  ---------- \n`;

	return logText;
};

/**
 * 格式化错误日志
 * @param ctx
 * @param err
 * @param ms
 * @returns {String}
 */
let formatError = function (ctx, err, ms) {
	//错误信息开始
	let logText = `\n---------- error log start ----------\n`;

	//添加请求日志
	logText += formatReqLog(ctx, ms);
	//响应状态码
	logText += `response status: ${ctx.status}\n`;
	//响应长度
	logText += `response length: ${bytes(ctx.length)}\n`;
	//错误名称
	logText += `err name: ${err.name}\n`;
	//错误信息
	logText += `err message: ${err.message}\n`;
	//错误详情
	logText += `err stack: ${err.stack}\n`;
	//错误信息结束
	logText += `---------- error log  end  ----------\n`;

	return logText;
};


/**
 * 格式化请求日志
 * @param ctx
 * @param ms
 * @returns {string}
 */
let formatReqLog = function (ctx, ms) {
	//访问方法
	let logText = `request method: ${ctx.method}\n`;
	//请求原始地址
	logText += `request originalUrl: ${ctx.originalUrl}\n`;
	//客户端ip
	logText += `request client ip: ${ctx.ip}\n`;

	//开始时间
	let startTime;

	//请求参数
	if (ctx.method === 'GET') {
		logText += `request query: ${JSON.stringify(ctx.query)}\n`;
	} else {
		logText += `request body: ${JSON.stringify(ctx.request.body)}\n`;
	}

	//服务器响应时间
	logText += `\nresponse time: ${ms}ms\n`;

	return logText;
};


let logger = function () {

	return async (ctx, next) => {
		//响应开始时间
		let startTime = new Date();
		//响应间隔时间
		let ms = 0;
		try {
			//进入到下一个中间件
			await next();

			ms = new Date() - startTime;
			//记录响应日志
			logResponse(ctx, ms);

		} catch (error) {
			ms = new Date() - startTime;
			//记录异常日志
			logError(ctx, error, ms);
			// console.log('log err')
			// throw error;
		}
	}
};

module.exports = logger;